//
////  SPARSEMATRIX_2.c
////  SparseMatrix
////
////  Created by Xavier on 2023/11/21.
//
//
//#define MAXSIZE 1000
//#define ElemType int
//#include <stdio.h>
//
////定义三元组
//typedef struct{
//    int row;
//    int col;
//    ElemType val;
//    
//}Triple;
//
////定义稀疏矩阵
//typedef struct{
//    Triple data[MAXSIZE+1];//0下标不用哈
//    int Matrix_Row;
//    int Matrix_Col;
//    int Matrix_SizeOf0;//记录非0的个数
//}TSMatrix;
//
////稀疏矩阵的快速转置 A-原矩阵 B-转置后的
//void TransMatrixQuickly(TSMatrix *A, TSMatrix *B) {
//    //将A的row,col 对应的赋值给B的col,row
//    B->Matrix_Row = A->Matrix_Col;
//    B->Matrix_Col = A->Matrix_Row;
//    B->Matrix_SizeOf0 = B->Matrix_SizeOf0;
//    
//    int cNum[MAXSIZE] = {0};
//    int cPos[MAXSIZE] = {0};
//    
//    //给cNum赋值 - 因为是按行先 所以从列哪里找
//    for (int i = 1; i <= A->Matrix_SizeOf0;i++) {
//        ++cNum[A->data[i].col];
//    }
////    printf("cNum:");
////    for (int i = 1; i <= A->Matrix_Col;i++) {
////        printf("%d,",cNum[i]);
////    }
////    printf("\n");
//    
//    //给cPos赋值
//    cPos[1] = 1;//第一个出现 所以是1
//    //从i>1开始 cPos[i] = cNum[i-1] + cPos[i-1];
//    for (int i = 2; i <= A->Matrix_Col; i++) {
//        cPos[i] = cNum[i-1] + cPos[i-1];
//    }
//    //开始找 赋值给B
//    for (int i = 1; i <= A->Matrix_SizeOf0; i++) {
//        int tmpCol = A->data[i].col; //从A的列中找 按顺序来
//        int numRow = cPos[tmpCol]; //从cPos中找到A给来的列 应该放在哪一个位置
//        
//        //找到后 放入B中
//        B->data[numRow].row = A->data[i].col;
//        B->data[numRow].col = A->data[i].row;
//        B->data[numRow].val = A->data[i].val;
//        ++cPos[tmpCol];//取完后+1 代表下一个元素应该放入的位置
//    }
//}
//    
//    
//    
//    
//
//int main(int argc, const char * argv[]) {
//    TSMatrix T;
//    T.Matrix_Row = 4;
//    T.Matrix_Col = 3;
//    T.Matrix_SizeOf0 = 4;
//    
//    //赋值 - 按行优先 (矩阵的下表0不用 所以从1开始赋值)
//    T.data[1].row = 2;
//    T.data[1].col = 2;
//    T.data[1].val = 1;
//    
//    T.data[2].row = 3;
//    T.data[2].col = 2;
//    T.data[2].val = 3;
//    
//    T.data[3].row = 4;
//    T.data[3].col = 1;
//    T.data[3].val = 6;
//    
//    T.data[4].row = 4;
//    T.data[4].col = 2;
//    T.data[4].val = 5;
//    
//    printf("转置前：\n");
//    for (int i = 1; i <= T.Matrix_SizeOf0; i++) {
//        printf("(%d,%d,%d)\n", T.data[i].row, T.data[i].col, T.data[i].val);
//    }
//    printf("打印转置前的矩阵：\n");
//    int index = 1;
//    for (int i = 1; i <= T.Matrix_Row; i++) {
//        for (int j = 1; j <= T.Matrix_Col; j++) {
//            if (T.data[index].row == i && T.data[index].col == j) {
//                printf("%3d", T.data[index++].val);
//            }else {
//                printf("%3d",0);
//            }
//        }
//        printf("\n");
//    }
//    
//    TSMatrix M;
//    TransMatrixQuickly(&T, &M);
//    printf("转置后：\n");
//    for (int i = 1; i <= T.Matrix_SizeOf0; i++) {
//        printf("(%d,%d,%d)\n", M.data[i].row, M.data[i].col, M.data[i].val);
//    }
//    printf("打印转置后的矩阵：\n");
//    index = 1;
//    for (int i = 1; i <= M.Matrix_Row; i++) {
//        for (int j = 1; j <= M.Matrix_Col; j++) {
//            if (M.data[index].row == i && M.data[index].col == j) {
//                printf("%3d", M.data[index++].val);
//            }else {
//                printf("%3d",0);
//            }
//        }
//        printf("\n");
//    }
//}
//
